Instalação e importação dos pacotes

# install.packages("ggplot2")
# install.packages("data.table")
# install.packages("stargazer")
# install.packages("skimr")

library(ggplot2)
library(data.table)
library(stargazer)
library(skimr)
library(readxl)
library(dplyr)

Criação da função que gera os gráficos.

### FUNÇÃO
box_plot = function(data, atributos, atributosSubgrupo, variavelDependente = 'Evadiu_formatado'){
  for (atributo in atributos) {
    if(length(atributosSubgrupo) > 0){
      for (atributo2 in atributosSubgrupo){
      result = ggplot(data = dtAmostra, aes_string(variavelDependente, atributo)) +
        geom_boxplot(aes_string(fill = atributo2)) +
        # geom_boxplot() +
        labs(x = variavelDependente,
             y = atributo,
             title = "Boxplot",
             subtitle = paste(atributo, variavelDependente, sep = " vs "),
             caption = "") +
        theme_bw() 
        # facet_wrap(~ atributo2)
      print(result)
     }
    }
    else{
      result = ggplot(data = dtAmostra, aes_string(variavelDependente, atributo)) +
        geom_boxplot() +
        labs(x = variavelDependente,
             y = atributo,
             title = "Boxplot",
             subtitle = paste(atributo, variavelDependente, sep = " vs "),
             caption = "") +
        theme_bw() 
        # facet_wrap(~ atributo2)
      print(result)      
    }
  }
}

Leitura do arquivo feita e análise dos dados

dtAmostra <- fread("dadosBanco/Amostra_Modelo_Evasao_Correntistas_v3.csv")

str(dtAmostra)
## Classes 'data.table' and 'data.frame':   100000 obs. of  36 variables:
##  $ Id                            : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Evadiu                        : int  0 1 1 0 1 0 0 0 1 1 ...
##  $ Segmento                      : chr  "GR" "GC" "GC" "GV" ...
##  $ Debito_Automatico             : int  0 0 0 0 0 1 1 0 0 0 ...
##  $ Credito_Salario               : int  1 1 0 0 0 0 1 0 1 0 ...
##  $ Credenciamento                : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Caixa_Seguradora              : int  1 0 0 0 0 1 1 1 0 0 ...
##  $ Pediu_Portabilidade           : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Abriu_Reclamacao              : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Debito_Automatico_DIF         : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Credito_Salario_DIF           : int  1 1 0 0 0 0 0 0 0 0 ...
##  $ Caixa_Seguradora_DIF          : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Produtos_Qualificados         : int  6 0 5 4 5 6 11 8 3 3 ...
##  $ Produtos_Qualificados_Anterior: int  8 1 6 3 5 5 8 10 3 3 ...
##  $ Produtos_Qualificados_DIF     : int  -2 -1 -1 1 0 1 3 -2 0 0 ...
##  $ Produtos_Qualificados_PERC    : num  -25 -100 -16.7 33.3 0 ...
##  $ Produtos                      : int  6 6 5 4 6 8 14 9 5 3 ...
##  $ Produtos_Anterior             : int  9 1 6 3 6 7 11 11 4 3 ...
##  $ Produtos_DIF                  : int  -3 5 -1 1 0 1 3 -2 1 0 ...
##  $ Produtos_PERC                 : num  -33.3 500 -16.7 33.3 0 ...
##  $ Movimentacoes                 : num  19.833 0.5 0.833 5.5 0.667 ...
##  $ Movimentacoes_Anterior        : num  1 0 1.17 6.5 3.5 ...
##  $ Movimentacoes_DIF             : num  18.833 0.5 -0.333 -1 -2.833 ...
##  $ Movimentacoes_PERC            : num  1883.3 0 -28.6 -15.4 -81 ...
##  $ Aplicacao                     : num  13818.1 412.6 4268.3 10.1 85.6 ...
##  $ Aplicacao_Anterior            : num  47067.83 7.04 1353.43 0 689.75 ...
##  $ Aplicacao_DIF                 : num  -33249.7 405.6 2914.8 10.1 -604.1 ...
##  $ Aplicacao_PERC                : num  -70.6 5760.7 215.4 0 -87.6 ...
##  $ Credito                       : num  0 0 0 54380 37511 ...
##  $ Credito_Anterior              : num  261 0 173110 56118 37511 ...
##  $ Credito_DIF                   : num  -261 0 -173110 -1738 0 ...
##  $ Credito_PERC                  : num  -100 0 -100 -3.1 0 ...
##  $ Rentabilidade                 : num  1010 1 5615 1664 650 ...
##  $ Rentabilidade_Anterior        : num  1009.29 2.88 5300.06 1233.58 2178.44 ...
##  $ Rentabilidade_DIF             : num  0.96 -1.88 315.24 430.46 -1528.05 ...
##  $ Rentabilidade_PERC            : num  0.0951 -65.2778 5.9479 34.8952 -70.1442 ...
##  - attr(*, ".internal.selfref")=<externalptr>

Como é possível verificar, existem uma série de dados que são caracterizados como inteiro, porém na verdade são variáveis que servem para classificar um determinado cliente.

Dessa forma, as variáveis foram transformadas em fatores.

dtAmostra$Evadiu <- as.factor(dtAmostra$Evadiu)
dtAmostra$Debito_Automatico <- as.factor(dtAmostra$Debito_Automatico)
dtAmostra$Credito_Salario <- as.factor(dtAmostra$Credito_Salario)
dtAmostra$Credenciamento <- as.factor(dtAmostra$Credenciamento)
dtAmostra$Caixa_Seguradora <- as.factor(dtAmostra$Caixa_Seguradora)
dtAmostra$Pediu_Portabilidade <- as.factor(dtAmostra$Pediu_Portabilidade)
dtAmostra$Abriu_Reclamacao <- as.factor(dtAmostra$Abriu_Reclamacao)
dtAmostra$Debito_Automatico_DIF <- as.factor(dtAmostra$Debito_Automatico_DIF)
dtAmostra$Credito_Salario_DIF <- as.factor(dtAmostra$Credito_Salario_DIF)
dtAmostra$Caixa_Seguradora_DIF <- as.factor(dtAmostra$Caixa_Seguradora_DIF)

dtAmostra = dtAmostra %>% mutate(Evadiu_formatado = ifelse(Evadiu == 1, "Sim", "Não")) 

str(dtAmostra)
## 'data.frame':    100000 obs. of  37 variables:
##  $ Id                            : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Evadiu                        : Factor w/ 2 levels "0","1": 1 2 2 1 2 1 1 1 2 2 ...
##  $ Segmento                      : chr  "GR" "GC" "GC" "GV" ...
##  $ Debito_Automatico             : Factor w/ 2 levels "0","1": 1 1 1 1 1 2 2 1 1 1 ...
##  $ Credito_Salario               : Factor w/ 2 levels "0","1": 2 2 1 1 1 1 2 1 2 1 ...
##  $ Credenciamento                : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
##  $ Caixa_Seguradora              : Factor w/ 2 levels "0","1": 2 1 1 1 1 2 2 2 1 1 ...
##  $ Pediu_Portabilidade           : Factor w/ 1 level "0": 1 1 1 1 1 1 1 1 1 1 ...
##  $ Abriu_Reclamacao              : Factor w/ 1 level "0": 1 1 1 1 1 1 1 1 1 1 ...
##  $ Debito_Automatico_DIF         : Factor w/ 3 levels "-1","0","1": 2 2 2 2 2 2 2 2 2 2 ...
##  $ Credito_Salario_DIF           : Factor w/ 3 levels "-1","0","1": 3 3 2 2 2 2 2 2 2 2 ...
##  $ Caixa_Seguradora_DIF          : Factor w/ 3 levels "-1","0","1": 2 2 2 2 2 2 2 2 2 2 ...
##  $ Produtos_Qualificados         : int  6 0 5 4 5 6 11 8 3 3 ...
##  $ Produtos_Qualificados_Anterior: int  8 1 6 3 5 5 8 10 3 3 ...
##  $ Produtos_Qualificados_DIF     : int  -2 -1 -1 1 0 1 3 -2 0 0 ...
##  $ Produtos_Qualificados_PERC    : num  -25 -100 -16.7 33.3 0 ...
##  $ Produtos                      : int  6 6 5 4 6 8 14 9 5 3 ...
##  $ Produtos_Anterior             : int  9 1 6 3 6 7 11 11 4 3 ...
##  $ Produtos_DIF                  : int  -3 5 -1 1 0 1 3 -2 1 0 ...
##  $ Produtos_PERC                 : num  -33.3 500 -16.7 33.3 0 ...
##  $ Movimentacoes                 : num  19.833 0.5 0.833 5.5 0.667 ...
##  $ Movimentacoes_Anterior        : num  1 0 1.17 6.5 3.5 ...
##  $ Movimentacoes_DIF             : num  18.833 0.5 -0.333 -1 -2.833 ...
##  $ Movimentacoes_PERC            : num  1883.3 0 -28.6 -15.4 -81 ...
##  $ Aplicacao                     : num  13818.1 412.6 4268.3 10.1 85.6 ...
##  $ Aplicacao_Anterior            : num  47067.83 7.04 1353.43 0 689.75 ...
##  $ Aplicacao_DIF                 : num  -33249.7 405.6 2914.8 10.1 -604.1 ...
##  $ Aplicacao_PERC                : num  -70.6 5760.7 215.4 0 -87.6 ...
##  $ Credito                       : num  0 0 0 54380 37511 ...
##  $ Credito_Anterior              : num  261 0 173110 56118 37511 ...
##  $ Credito_DIF                   : num  -261 0 -173110 -1738 0 ...
##  $ Credito_PERC                  : num  -100 0 -100 -3.1 0 ...
##  $ Rentabilidade                 : num  1010 1 5615 1664 650 ...
##  $ Rentabilidade_Anterior        : num  1009.29 2.88 5300.06 1233.58 2178.44 ...
##  $ Rentabilidade_DIF             : num  0.96 -1.88 315.24 430.46 -1528.05 ...
##  $ Rentabilidade_PERC            : num  0.0951 -65.2778 5.9479 34.8952 -70.1442 ...
##  $ Evadiu_formatado              : chr  "Não" "Sim" "Sim" "Não" ...

A variável Pediu_Portabilidade possui um valor constante e, por conta disso, foi retirada.

Como o interesse é buscar predizer a variável Evadiu, verificamos todas as outras variáveis em conjunto com a variável alvo para verificar o resultado.

No entanto, nos deparamos com algo do tipo:

box_plot(credit, c("Aplicacao"), NULL)

Ou seja, existem outliers com valores muito altos e que, na verdade, não estão dentro da maioria dos dados relevantes (75%).

Assim, aplicamos uma função chamada winsor que tem a função de eliminar esses outliers, como foi feito abaixo:

dtAmostra = dtAmostra %>% 
  mutate(winsored_Rentabilidade_PERC = psych::winsor(Rentabilidade_PERC, 0.1)) %>%
  mutate(winsored_Produtos = psych::winsor(Produtos, 0.01)) %>%
  mutate(winsored_Produtos_Qualificados_PERC = psych::winsor(Produtos_Qualificados_PERC, 0.01)) %>%
  mutate(winsored_Produtos_PERC = psych::winsor(Produtos_PERC, 0.01)) %>%
  mutate(winsored_Movimentacoes = psych::winsor(Movimentacoes, 0.1)) %>%
  mutate(winsored_Movimentacoes_Anterior = psych::winsor(Movimentacoes_Anterior, 0.1)) %>%
  mutate(winsored_Movimentacoes_DIF = psych::winsor(Movimentacoes_DIF, 0.1)) %>%
  mutate(winsored_Movimentacoes_PERC = psych::winsor(Movimentacoes_PERC, 0.1)) %>%
  mutate(winsored_Aplicacao = psych::winsor(Aplicacao, 0.1)) %>%
  mutate(winsored_Aplicacao_Anterior = psych::winsor(Aplicacao_Anterior, 0.1)) %>%
  mutate(winsored_Aplicacao_DIF = psych::winsor(Aplicacao_DIF, 0.1)) %>% 
  mutate(winsored_Aplicacao_PERC = psych::winsor(Aplicacao_PERC, 0.1)) %>% 
  mutate(winsored_Credito = psych::winsor(Credito, 0.1)) %>% 
  mutate(winsored_Credito_Anterior = psych::winsor(Credito_Anterior, 0.1)) %>% 
  mutate(winsored_Credito_DIF = psych::winsor(Credito_DIF, 0.1)) %>% 
  mutate(winsored_Credito_PERC = psych::winsor(Credito_PERC, 0.1)) %>% 
  mutate(winsored_Rentabilidade = psych::winsor(Rentabilidade, 0.1)) %>% 
  mutate(winsored_Rentabilidade_Anterior = psych::winsor(Rentabilidade_Anterior, 0.1)) %>% 
  mutate(winsored_Rentabilidade_DIF = psych::winsor(Rentabilidade_DIF, 0.1)) %>% 
  mutate(winsored_Rentabilidade_PERC = psych::winsor(Rentabilidade_PERC, 0.1))

Feito isso, rodamos novamente os gráficos para verificarmos quais das variáveis mais seria interessante de se usar como preditora da variável alvo.

Segue resultado abaixo:

variaveisIniciais <- c("Produtos",
                       "Produtos_Anterior",
                       "Produtos_DIF",
                       "winsored_Produtos_Qualificados_PERC",
                       "Produtos_Qualificados_DIF",
                       "Produtos_Qualificados_Anterior",
                       "Produtos_Qualificados",
                       "winsored_Produtos_PERC",
                       "winsored_Aplicacao",
                       "winsored_Aplicacao_Anterior",
                       "winsored_Aplicacao_PERC", 
                       "winsored_Aplicacao_DIF",
                       "winsored_Movimentacoes",
                       "winsored_Movimentacoes_DIF",
                       "winsored_Movimentacoes_PERC", 
                       "winsored_Movimentacoes_Anterior", 
                       "winsored_Credito", 
                       "winsored_Credito_Anterior", 
                       "winsored_Credito_PERC", 
                       "winsored_Credito_DIF", 
                       "winsored_Rentabilidade", 
                       "winsored_Rentabilidade_DIF", 
                       "winsored_Rentabilidade_Anterior", 
                       "winsored_Rentabilidade_PERC")

box_plot(credit, variaveisIniciais, NULL)

É interessante colocar também que aquelas variáveis que foram identificadas como fatores não tiveram um bom relacionamento a preditora, assim foram utilizadas como uma terceira variável de análise (visão) em conjunto com aquelas variáveis que tiveram um melhor resultado na predição:

variaveisSubgrupo <- c("Segmento", "Credenciamento", "Caixa_Seguradora", "Caixa_Seguradora_DIF", "Credito_Salario", "Debito_Automatico", "Credito_Salario_DIF", "Debito_Automatico_DIF")

box_plot(credit, c("winsored_Movimentacoes", "Produtos_Qualificados", "winsored_Aplicacao_PERC", "winsored_Credito_DIF"), variaveisSubgrupo)